import telebot
from keyboa import Keyboa, Button
from telebot import formatting
from telebot.formatting import mbold

from api import login, send_request, get_last_user_request

BOT_TOKEN = os.environ['TOKEN']

bot = telebot.TeleBot(BOT_TOKEN)
registered_users = dict()

bot.delete_my_commands(scope=None, language_code=None)

bot.set_my_commands(
    commands=[
        telebot.types.BotCommand("/start", "Приветсвенное сообщение"),
        telebot.types.BotCommand("/login", "Залогиниться")
    ],
)


@bot.message_handler(commands=['start', 'hello'])
def send_welcome(message):
    bot.reply_to(message, "Вас приветсвует бот для написания заявлений. Чтобы оставить заявление или посмотреть свои "
                          "прошлые заявления залогиньтесь или зарегетсрируйтесь в боте.\n/login")


@bot.message_handler(commands=['login'])
def login_handler(message):
    if message.chat.id in registered_users:
        bot.reply_to(message, "Вы уже залогинены")
    else:
        bot.reply_to(message, "Введите почту или имя пользователя")
        bot.register_next_step_handler(message, register_login)


def register_login(message):
    username = message.text
    bot.reply_to(message, "А теперь введите пароль")
    bot.register_next_step_handler(message, register_password, username)


def register_password(message, username):
    password = message.text
    bot.reply_to(message, "Проверяю введенные данные")
    resp = login(username, password)
    if resp.ok:
        body = resp.json()
        if body["user"]["role"] != "user":
            bot.reply_to(message, "Этот бот только для пользователей. Для других ролей есть сайт")
            return
        registered_users[message.chat.id] = body
        bot.delete_my_commands(scope=None, language_code=None)

        bot.set_my_commands(
            commands=[
                telebot.types.BotCommand("/start", "Приветсвенное сообщение"),
                telebot.types.BotCommand("/write", "Написать заявление"),
                telebot.types.BotCommand("/read", "Посмотреть все заявления"),
                telebot.types.BotCommand("/read_open", "Посмотреть открытые заявления"),
                telebot.types.BotCommand("/read_in_progress", "Посмотреть заявления, которые находяться в работе"),
                telebot.types.BotCommand("/read_closed", "Посмотреть закрытые заявления"),
                telebot.types.BotCommand("/unlogin", "Разлогиниться")
            ],
        )
        bot.reply_to(message, "Вы успешно зарегистрировались!\nТеперь вы можете писать и просматривать свои "
                              "заявления!\n/write для написания и /read для чтения")
    else:
        bot.reply_to(message, "Вы совершили ошибку при авторизации. Пожалуйста, попробуйте еще раз")


def request_handler(message):
    s = message.text.split("\n", 1)
    if len(s) == 1:
        description = None
    else:
        description = s[1]
    topic = s[0]
    token = registered_users[message.chat.id]['tokens']['access_token']
    resp = send_request(topic, description, token)
    if resp.ok:
        bot.reply_to(message, "Вы успешно отправили заявление")
    else:
        bot.reply_to(message, "Что-то пошло не так. Попробуйте отправить заявление на почту или на сайте")


# Ниже будут методы для авторизированных пользователей
@bot.message_handler(commands=["write"])
def write_request(message):
    if message.chat.id in registered_users:
        bot.reply_to(message, "В первом абзаце напишите тему заявления, а во всех остальных распишите подробности("
                              "подробности не обязательны)")
        bot.register_next_step_handler(message, request_handler)
    else:
        bot.reply_to(message, "Вам необходимо зарегистрироваться, чтобы отправить заявление")


@bot.message_handler(commands=["read"])
def read_requests(message, status=None):
    if message.chat.id in registered_users:
        token = registered_users[message.chat.id]['tokens']['access_token']
        resp = get_last_user_request(token, 1, status)
        if resp.ok:
            resp_json = resp.json()
            if resp_json["pages"] == 0:
                bot.reply_to(message, "У вас пока нет заявлений")
            else:
                menu = [Button(button_data={"Дальше": "2 {}".format(resp_json["pages"])}).button]
                keyboard = Keyboa(items=menu)
                item = resp_json["items"][0]
                if item["current_status"]['status'] == 'closed':
                    m = "Закрыто"
                elif item["current_status"]['status'] == 'open':
                    m = "Открыто"
                else:
                    m = 'В работе'
                if resp_json["pages"] > 1:
                    bot.reply_to(message, "\n".join(
                        [formatting.format_text(mbold(m)), item["topic"],
                         item["description"]]), parse_mode="Markdown", reply_markup=keyboard())
                else:
                    bot.reply_to(message, "\n".join([formatting.format_text(mbold(m)),
                                                     item["topic"], item["description"]]), parse_mode="Markdown")
        else:
            bot.reply_to(message, "Не удалось получить ваши заявлния")

    else:
        bot.reply_to(message, "Вам необходимо зарегистрироваться, чтобы посмотреть заявления")


@bot.message_handler(commands=["read_open"])
def read_open_requests(message):
    read_requests(message, 'open')


@bot.message_handler(commands=["read_in_progress"])
def read_open_requests(message):
    read_requests(message, 'in_progress')


@bot.message_handler(commands=["read_closed"])
def read_open_requests(message):
    read_requests(message, 'closed')


@bot.message_handler(commands=["unlogin"])
def unlogin(message):
    if message.chat.id in registered_users:
        del registered_users[message.chat.id]
        bot.reply_to(message, "Вы успешно разлогинились")
    else:
        bot.reply_to(message, "Вы и так не залогинены")


def read_request_by_offset(message, offset, pages):
    if message.chat.id in registered_users:
        btn_next = Button(button_data={"Дальше": "{} {}".format(offset + 1, pages)}).button
        btn_prev = Button(button_data={"Предыдущий": "{} {}".format(offset - 1, pages)}).button
        menu = []
        if offset > 1:
            menu.append(btn_prev)
        if offset < pages:
            menu.append(btn_next)
        keyboard = Keyboa(items=menu, items_in_row=2)

        token = registered_users[message.chat.id]['tokens']['access_token']
        resp = get_last_user_request(token, offset)
        if resp.ok:
            resp_json = resp.json()
            item = resp_json["items"][0]
            if item["current_status"]['status'] == 'closed':
                m = "Закрыто"
            elif item["current_status"]['status'] == 'open':
                m = "Открыто"
            else:
                m = 'В работе'
            bot.reply_to(message, "\n".join([formatting.format_text(mbold(m)),
                                             item["topic"], item["description"]]), parse_mode="Markdown",
                         reply_markup=keyboard())
        else:
            bot.reply_to(message, "Не удалось получить ваше заявлние")

    else:
        bot.reply_to(message, "Вам необходимо зарегистрироваться, чтобы посмотреть заявления")


@bot.callback_query_handler(func=lambda call: True)
def handle_button_click(call):
    s: str = call.data
    offset, pages = map(int, s.split(" "))
    read_request_by_offset(call.message, offset, pages)


bot.infinity_polling()
